'''
    1.将计算器导入进来

    1.传统测试有以下几个问题：
        1.若程序中间报错，后面的程序将不再执行

        2.测试结果需要在控制台去用肉眼观察
    2.单元测试框架：unittest

        2.1 导包TestCase   --> 测试用例类

        2.2 自己类继承TestCase

        2.3 编写测试用例-就是方法
            但是方法必须是testXxxx
    unittest的测试方式有个问题：
        这种执行方式数据是动态变化，但是其他代码都是固定的。
        因此这这种代码没必要写这么多遍。
    3. 参数化测试
        ddt：  data  driver  test
            数据驱动测试: 由数据来驱动测试的进行。
        3.1 默认安装ddt最新版
        3.2 导包ddt,data,unpack
            测试就编程由数据来驱动整体的进行
        3.3

'''

from Calc import Calc

# 1.导包
from unittest import TestCase
from ddt import ddt, data, unpack
import xlrd
import xlwt


def readData(excelName, name):
    wb = xlrd.open_workbook(filename=excelName)
    st = wb.sheet_by_name(name)
    a = []
    for i in range(1, st.nrows):
        b = st.row_values(i)[:3]
        a.append(b)
    return a


da1 = readData("D:\pythonProject\excel\计算器测试数据(1).xlsx", "加法测试数据")  # 必须是二维列表
da2 = readData("D:\pythonProject\excel\计算器测试数据(1).xlsx", "减法测试数据")  # 必须是二维列表
da3 = readData("D:\pythonProject\excel\计算器测试数据(1).xlsx", "乘法测试数据")  # 必须是二维列表
da4 = readData("D:\pythonProject\excel\计算器测试数据(1).xlsx", "除法测试数据")  # 必须是二维列表


@ddt  # 1.用ddt来修饰类：这个类有资格进行参数化测试
class TestCalc(TestCase):  # 继承TestCase,表示有资格单元测试。前面出现绿色三角按钮，表示你有资格进行单元测试

    @data(*da1)  # 2.使用@data引入数据源
    @unpack  # 3.使用unpack对二维列表进行解包
    def testAdd(self, a, b, c):  # 必须test开头，大小写严格区分，testXxxx

        calc = Calc()
        s = calc.add(a, b)

        # 使用断言
        self.assertEqual(c, s)  # 自动进行期望结果和实际结果的判断

    @data(*da2)  # 2.使用@data引入数据源
    @unpack  # 3.使用unpack对二维列表进行解包
    def testMinus(self, a, b, c):  # 必须test开头，大小写严格区分，testXxxx

        calc = Calc()
        s = calc.minus(a, b)

        # 使用断言
        self.assertEqual(c, s)  # 自动进行期望结果和实际结果的判断

    @data(*da3)  # 2.使用@data引入数据源
    @unpack  # 3.使用unpack对二维列表进行解包
    def testMulti(self, a, b, c):  # 必须test开头，大小写严格区分，testXxxx

        calc = Calc()
        s = calc.multi(a, b)

        # 使用断言
        self.assertEqual(c, s)  # 自动进行期望结果和实际结果的判断

    @data(*da4)  # 2.使用@data引入数据源
    @unpack  # 3.使用unpack对二维列表进行解包
    def testDevision(self, a, b, c):  # 必须test开头，大小写严格区分，testXxxx

        calc = Calc()
        s = calc.devision(a, b)

        # 使用断言
        self.assertEqual(c, s)  # 自动进行期望结果和实际结果的判断
